www.gusucode.com > 一个美化窗口实例 VC++漂亮界面源码程序 > 一个美化窗口实例 VC++漂亮界面/其它可以引用的类源码/VC++菜单类的演示/MyPrint.cpp

    #include "StdAfx.h"
#include "MyPrint.h" 
//构造函数
CMyPrint::CMyPrint ()
{
	m_CDC=new CDC();
	strDocName="打印";
	blnVal=FALSE;
	m_rcPrintMargin.left=25;
	m_rcPrintMargin.right=25;
	m_rcPrintMargin.top=40;
	m_rcPrintMargin.bottom=30;
	nXPixelsOfInch=300;
	nYPixelsOfInch=300;
	rcContent.left=m_rcPrintMargin.left;
	rcContent.top=m_rcPrintMargin.top;
	rcContent.right=600;
	rcContent.bottom=800;
}
//析构函数
CMyPrint::~CMyPrint()
{
	if (m_hDevNames != NULL)
        GlobalFree(m_hDevNames);
	if (m_hDevMode != NULL)
        GlobalFree(m_hDevMode);
	if(m_CDC->m_hDC!=NULL)
	{
		m_CDC->ReleaseOutputDC();
		m_CDC->~CDC();
	}		
}
//释放内存
// download by http:www.codesc.net
void CMyPrint::FreeAllMemory()
{
	if (m_hDevNames != NULL)
        GlobalFree(m_hDevNames);
	if (m_hDevMode != NULL)
        GlobalFree(m_hDevMode);
	if(m_CDC->m_hDC!=NULL)
	{
		m_CDC->ReleaseOutputDC();
	}
}
//返回CDC指针
CDC* CMyPrint::GetMyCdc()
{
	//	打印设置
	GetPrinterDeviceDefaults();
	//	设置默认打印方向为横向
	SetPrintOrientation(blnVal);
	PRINTDLG	pd;
	memset(&pd, 0, sizeof(PRINTDLG));
	pd.lStructSize = sizeof(PRINTDLG);
	pd.Flags = PD_RETURNDC | PD_NOSELECTION;
	pd.hDC = NULL;
	pd.hwndOwner = NULL;
	pd.hInstance = NULL;
	pd.nMaxPage = 1;
	pd.nMinPage = 1;
	pd.nFromPage = 1;
	pd.nToPage = 1;
	pd.nCopies = 1;
	pd.hDevMode = NULL;
	pd.hDevNames = NULL;
	pd.hDevMode = m_hDevMode;
	//显示打印对话框,由用户来设定纸张大小等。
	if (!PrintDlg(&pd))
		return FALSE;
	ASSERT(pd.hDC != NULL);
	int nHorRes = GetDeviceCaps(pd.hDC, HORZRES); 
	int nVerRes = GetDeviceCaps(pd.hDC, VERTRES);
	nXPixelsOfInch = GetDeviceCaps(pd.hDC, LOGPIXELSX);
	nYPixelsOfInch = GetDeviceCaps(pd.hDC, LOGPIXELSY);
	//	计算页面可写面积
	rcContent.left=m_rcPrintMargin.left;
	rcContent.top=m_rcPrintMargin.top;
	rcContent.right=(long)(nHorRes*GetPrintProportionX()-m_rcPrintMargin.right);
	rcContent.bottom=(long)(nVerRes*GetPrintProportionY()-m_rcPrintMargin.bottom);
	//	开始打印
	DOCINFO di;
	di.cbSize = sizeof(DOCINFO);
	di.lpszDocName =strDocName; 
	di.lpszOutput = (LPTSTR) NULL; 
	di.lpszDatatype = (LPTSTR) NULL; 
	di.fwType = 0; 
	StartDoc(pd.hDC, &di);
	if(m_CDC->m_hDC!=NULL)
	{
		m_CDC->ReleaseOutputDC();
	}
	m_CDC->m_hDC=pd.hDC;
	return m_CDC;
}
//人为的获得打印机的驱动
CDC* CMyPrint::GetManCdc(CString strDriver,CString strDevice, CString strOutput, CONST DEVMODE* lpInitData)
{
	if(m_CDC->m_hDC!=NULL)
	{
		m_CDC->ReleaseOutputDC();
	}
	m_CDC->m_hDC=CreateDC((LPCSTR)strDriver,(LPCSTR)strDevice,(LPCSTR)strOutput,lpInitData);
	DOCINFO df={sizeof(DOCINFO),"打印",NULL};
	int nHorRes = GetDeviceCaps(m_CDC->m_hDC, HORZRES); 
	int nVerRes = GetDeviceCaps(m_CDC->m_hDC, VERTRES);
	nXPixelsOfInch = GetDeviceCaps(m_CDC->m_hDC, LOGPIXELSX);
	nYPixelsOfInch = GetDeviceCaps(m_CDC->m_hDC, LOGPIXELSY);
	//	计算页面可写面积
	rcContent.left=m_rcPrintMargin.left;
	rcContent.top=m_rcPrintMargin.top;
	rcContent.right=(long)(nHorRes*GetPrintProportionX()-m_rcPrintMargin.right);
	rcContent.bottom=(long)(nVerRes*GetPrintProportionY()-m_rcPrintMargin.bottom);
	m_CDC->StartDoc(&df);
	return m_CDC;
}
//得到系统的打印设备属性
BOOL CMyPrint::GetPrinterDeviceDefaults(void)
{
	PRINTDLG printDlg;
	if(AfxGetApp()->GetPrinterDeviceDefaults(&printDlg))
	{
		LPDEVNAMES pDevNames =
			(LPDEVNAMES)::GlobalLock(printDlg.hDevNames);
		LPDEVMODE  pDevMode  = (LPDEVMODE)::GlobalLock(printDlg.hDevMode);		
		if (m_hDevNames != NULL)
			::GlobalFree(m_hDevNames);
		if (m_hDevMode != NULL)
			::GlobalFree(m_hDevMode);		
		m_hDevNames = ::GlobalAlloc(GPTR,
			::GlobalSize(printDlg.hDevNames));
		m_hDevMode = ::GlobalAlloc(GPTR, ::GlobalSize(printDlg.hDevMode));		
		LPDEVNAMES pNewDevNames = (LPDEVNAMES)::GlobalLock(m_hDevNames);
		LPDEVMODE  pNewDevMode  = (LPDEVMODE)::GlobalLock(m_hDevMode);		
		memcpy(pNewDevNames, pDevNames,
			(size_t)::GlobalSize(printDlg.hDevNames));
		memcpy(pNewDevMode, pDevMode,
			(size_t)::GlobalSize(printDlg.hDevMode));		
		::GlobalUnlock(printDlg.hDevNames);
		::GlobalUnlock(printDlg.hDevMode);		
		::GlobalUnlock(m_hDevNames);
		::GlobalUnlock(m_hDevMode);
		return TRUE;
	}
	else
	{
		return FALSE;
    }
}
//	设置打印方向
//	TRUE:横向
//	FALSE:纵向
BOOL CMyPrint::SetPrintOrientation(BOOL bVal)
{
	if (m_hDevMode == NULL)
		return FALSE;
	LPDEVMODE  pNewDevMode  = (LPDEVMODE)::GlobalLock(m_hDevMode);
	if (bVal)
		pNewDevMode->dmOrientation = DMORIENT_LANDSCAPE;	//	横向
	else
		pNewDevMode->dmOrientation = DMORIENT_PORTRAIT;		//	纵向
	::GlobalUnlock(m_hDevMode);
	return TRUE;
}
//开始打印
void CMyPrint::DoPrint()
{
	m_CDC->EndDoc();
	m_CDC->DeleteDC();
}
//得到像素向英寸转换的比例
//像素:英寸=?:1
double CMyPrint::GetPrintProportionX()
{
	double pProportion;
	//分辨率 每英寸的象素点 1250
	pProportion=nXPixelsOfInch/1250.0;
	return pProportion;
}
//由像素转换成所需的英寸
int CMyPrint::IntToRealIntX(int i)
{
	int iTemp;
	iTemp=int(i*1.0/GetPrintProportionX());
	return iTemp;
}
double CMyPrint::GetPrintProportionY()
{
	double pProportion;
	//分辨率 每英寸的象素点 1250
	pProportion=nYPixelsOfInch/1250.0;
	return pProportion;
}
//由像素转换成所需的英寸
int CMyPrint::IntToRealIntY(int i)
{
	int iTemp;
	iTemp=int(i*1.0/GetPrintProportionY());
	return iTemp;
}